import jwt
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed

from user.models import UserModel
from utils.jwttool import tooljwt


class MyAuthentication(BaseAuthentication):
    def authenticate(self,request):
        # 从请求头中获取token
        token = request.META.get('HTTP_AUTHORIZATION', None)
        # 如果没有token，抛出AuthenticationFailed异常
        if not token:
            raise AuthenticationFailed('缺少token')
        # 将token分割成两部分，取第二部分作为tokendata
        tokendata=token.split(' ')[1]
        try:
            # 使用tooljwt.decodejwt方法解码tokendata
            decodedata=tooljwt.decodejwt(tokendata)
            # 根据解码后的数据中的user字段，从UserModel中获取用户信息
            userinfo=UserModel.objects.filter(id=decodedata['user']).first()
            # 如果没有找到用户，抛出AuthenticationFailed异常
            if not userinfo:
                raise AuthenticationFailed('用户不存在')
        except jwt.ExpiredSignatureError:
            # 如果token过期，抛出ExpiredSignatureError异常
            raise jwt.ExpiredSignatureError('token过期')
        except jwt.InvalidTokenError:
            # 如果token无效，抛出AuthenticationFailed异常
            raise AuthenticationFailed('token无效')
        # 返回用户对象和None
        return (userinfo, None)